# 练习：找一个网页，例如https://www.python.org/events/python-events/，用浏览器查看源码并复制，然后尝试解析一下HTML，输出Python官网发布的会议时间、名称和地点。

# -*- coding: utf-8 -*-
# 建议1: 子类在重载构造函数时不要忘了调用父类的构造函数
# 建议2: HTMLParser的attrs是一个元素为tuple的list
# 建议3: 调用类属性时，一定要加self, 否则相当于声明了新的临时变量
from html.parser import HTMLParser
from html.entities import name2codepoint
from urllib import request


class MyHTMLParser(HTMLParser):

    # 解析一下HTML，输出Python官网发布的会议时间、名称和地点。
    def __init__(self):
        super().__init__()
        self._event_title = []
        self._event_location = []
        self._event_time = []
        self._reading_title = False
        self._reading_time = False
        self._reading_location = False

    # 解析头标签
    def handle_starttag(self, tag, attrs):
        if tag == 'time':
            self._reading_time = True
        if len(attrs) >= 1:
            if tag == 'h3' and attrs[0][1] == 'event-title':
                self._reading_title = True
            if tag == 'span' and attrs[0][1] == 'event-location':
                self._reading_location = True

    # 解析内容
    def handle_data(self, data):
        if self._reading_title:
            self._event_title.append(data)
            self._reading_title = False
        if self._reading_time:
            self._event_time.append(data)
            self._reading_time = False
        if self._reading_location:
            self._event_location.append(data)
            self._reading_location = False

    @property
    def data(self):
        self._data = []
        for i in range(len(self._event_title)):
            dic = {}
            dic["title"] = self._event_title[i]
            dic["time"] = self._event_time[i]
            dic["location"] = self._event_location[i]
            self._data.append(dic)
        return self._data


def getHtml():
    with request.urlopen('https://www.python.org/events/python-events/') as f:
        data = f.read().decode('utf-8')
    return data


parser = MyHTMLParser()
parser.feed(getHtml())
for item in parser.data:
    print(str(item))

print('===================================================================================================')
#!/usr/bin/python3
# -*- coding:utf-8 -*-

from html.parser import HTMLParser                    # 引入HTML解析模块
from urllib import request                            # 引入URL请求模块
import re                                             # 引入正则表达式模块


class MyHTMLParser1(HTMLParser):

    def __init__(self):
        HTMLParser.__init__(self)                     # 继承父类的属性
        self.is_time = False                          # 初始化时间布尔值，用于判断标签是否表示时间，下面类似
        self.is_title = False
        self.is_location = False
        self.is_year = False
        self.info = []                                # 初始化一个list，用于储存获取的信息

    def handle_starttag(self, tag, attrs):            # 定义开始标签处理器
        if tag == 'time':                            # 判断标签是否表示时间，若是，更改布尔值，下面类似
            self.is_time = True

        if tag == 'h3' and ('class', 'event-title') in attrs:         # 判断标题标签
            self.is_title = True

        if tag == 'span' and ('class', 'event-location') in attrs:    # 判断地点标签
            self.is_location = True

        if tag == 'span' and ('class', 'say-no-more') in attrs:       # 判断年份标签
            self.is_year = True

    def handle_data(self, data):                              # 定义数据内容处理器
        if self.is_time == True:                              # 如果标签为时间
            self.is_time = False                              # 初始化时间布尔值
            # 把数据储存在info中，下面类似操作标题、地点、年份
            self.info.append(dict(会议时间=data))
        if self.is_title == True:
            self.is_title = False
            self.info.append(dict(会议名称=data))
        if self.is_location == True:
            self.is_location = False
            self.info.append(dict(会议地点=data))
        if self.is_year == True:
            self.is_year = False
            # 由于网页源码中出现是年份标签但显示的内容不是年份，所以增加一个正则表达式来判断
            if re.match(r'[0-9]', data.strip()):
                self.info.append(dict(会议年份=data))


def getinfo(data, u):                                 # 定义信息处理函数
    parser = MyHTMLParser1()                        # 创建HTML解析器
    parser.feed(data)                              # 解析HTML文件
    count = 0                                      # 初始化count
    print('抓取网址：%s\n抓取信息如下：' % u)
    for x in parser.info:                          # 打印info
        for key in x:                             # 由于info存的是dict组成的list，所以还要遍历dict
            print(key + ':' + str(x[key]))
        count += 1
        if count % 4 == 0:                         # 当输出四个数据后，打印分割线
            print('-------------------------------')


web = 'https://www.python.org/events/python-events/'
with request.urlopen(web) as f:       # 打开网页
    Data = f.read()
    Data = Data.decode('utf-8')

getinfo(Data, web)                                      # 解析文件并打印信息
